package models.mappers;

import models.WdTask;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vos.SellerWdTaskVo;
import vos.WdTaskSearchVo;

import java.util.List;

public interface WdTaskMapper {

    /**
     * 新增任务
     *
     * @param task
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月15日
     */
    void insert(WdTask task);

    /**
     * 更新任务
     *
     * @param task
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月15日
     */
    void update(WdTask task);


    /**
     * 查询任务
     *
     * @param id
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月19日
     */
    @Select("select * from wd_task where id=#{id}")
    WdTask findById(@Param("id") Long id);

    /**
     * 更新支付状态
     *
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月19日
     */
    @Update("update wd_task set status='WAIT_EXAMINE' where id = #{id}")
    void updatePayStatus(@Param("id") Long id);

    @Select("select status, count(1) as count from wd_task where seller_id = #{id} and status in ('WAIT_EXAMINE', 'NOT_PASS') group by status")
    List<WdTask> statiscisStatusTask(@Param("id") Long sellerId);

    Integer countForSeller(WdTaskSearchVo vo);

    List<SellerWdTaskVo> selectVoListForSeller(WdTaskSearchVo vo);

    /**
     * 查询任务
     *
     * @param id
     * @return
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月27日
     */
    @Select("select ${fileds} from wd_task where id=#{id}")
    WdTask findFiledsById(@Param("fileds") String fileds, @Param("id") Long id);

    @Update("update wd_task set status = #{status}, modify_time = #{modifyTime} where id = #{id}")
    void cancelTask(WdTask task);


    Integer countSellerWdTaskVoForAdmin(WdTaskSearchVo vo);

    /**
     * 查询任务列表（管理用）
     *
     * @param vo
     * @return
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月28日
     */
    List<SellerWdTaskVo> listSellerWdTaskVoForAdmin(WdTaskSearchVo vo);

    /**
     * 查询已超期的任务
     *
     * @return
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年3月31日
     */
    @Select("select * from wd_task where status = 'PROCESSING' and order_deadline < sysdate()")
    List<WdTask> listOverdueTasks();

    /**
     * 统计买手未接手的任务
     *
     * @param buyerId
     * @return
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年4月1日
     */
    @Select("select count(1) from wd_task wt where not exists (select 1 from wd_share_task where task_id = wt.id and buyer_id = #{buyerId} and status<>'CANCLED') and status = 'PROCESSING' and wt.share_deadline>SYSDATE()")
    Integer countTaskForBuyer(@Param("buyerId") Long buyerId);

    @Select("select wt.* from wd_task wt " +
            "where not exists (select 1 from wd_share_task where task_id = wt.id and buyer_id = #{buyerId}  and status<>'CANCLED') " +
            "and wt.share_deadline>SYSDATE() " +
            "and wt.status='PROCESSING' " +
            "order by publish_time " +
            "limit #{startIndex}, #{pageSize}")
    List<WdTask> listTaskForBuyer(WdTaskSearchVo vo);

    /**
     * 领取分享任务
     *
     * @param task
     * @author 刘志远<yuanzhi-2@163.com>
     * @since 2017年4月4日
     */
    @Update("update wd_task set take_count = #{takeCount} where id = #{id}")
    void updateTakeCount(WdTask task);

    @Select("select count(1) from wd_order_task where task_id=#{taskId} and status='REFUNDED'")
    Integer countRefundTask(@Param("taskId") Long taskId);

    @Select("select * from wd_task WT where WT.status='WAIT_BALANCE' and not exists (select 1 from wd_share_task WST where WST.task_id = WT.id and (WST.status!='FINISHED' and WST.status!='CANCLED'))")
    List<WdTask> listFinishedTask();

    @Update("update wd_task set status='FINISHED' where id=#{id}")
    void finishTask(@Param("id") Long id);
}
